/*
数据库模块
实现数据库的初始化和连接
GORM 能自动处理参数化查询，从而减少SQL注入的风险
*/

package model

import (
    "fmt"
    "os"
    "time"

    "gitee.com/keeving/quanta-test-cat/utils"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
    "gorm.io/gorm/schema"
)

var db *gorm.DB
var err error

func InitDb() {

    dns := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
        utils.DbUser,
        utils.DbPassWord,
        utils.DbHost,
        utils.DbPort,
        utils.DbName,
    )
    db, err = gorm.Open(mysql.Open(dns), &gorm.Config{
        // gorm日志模式：silent
        Logger: logger.Default.LogMode(logger.Silent),
        // 外键约束
        DisableForeignKeyConstraintWhenMigrating: true,
        // 禁用默认事务（提高运行速度）
        SkipDefaultTransaction: true,
        NamingStrategy: schema.NamingStrategy{
            // 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`
            SingularTable: true,
        },
    })

    if err != nil {
        fmt.Println("连接数据库失败，请检查参数：", err)
        os.Exit(1)
    }

    // 迁移数据表，在没有数据表结构变更时候，建议注释不执行
    // 注意:初次运行后可注销此行
    _ = db.AutoMigrate(&User{}, &Article{}, &Category{}, &Cat{}, &Comment{}, &Collect{}, &LikeArticle{}, &CatPhoto{}, &FirstLike{})

    sqlDB, _ := db.DB()
    // SetMaxIdleCons 设置连接池中的最大闲置连接数。
    sqlDB.SetMaxIdleConns(10)

    // SetMaxOpenCons 设置数据库的最大连接数量。
    sqlDB.SetMaxOpenConns(100)

    // SetConnMaxLifetiment 设置连接的最大可复用时间。
    sqlDB.SetConnMaxLifetime(10 * time.Second)

}
